package com.ias.common.utils.page;

import com.ias.common.result.PageResult;
import com.ias.common.utils.log.ExcpUtil;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 分页工具类
 * 用于创建和转换分页结果
 * 
 * @author IAS Team
 * @since 1.0.0
 */
@Slf4j
public class PageUtil {
    
    /**
     * 创建分页结果
     *
     * @param records 数据列表
     * @param total   总记录数
     * @param current 当前页码
     * @param size    每页大小
     * @param <T>     泛型类型
     * @return PageResult分页结果
     */
    public static <T> PageResult<T> of(List<T> records, Long total, Long current, Long size) {
        return PageResult.of(records, total, current, size);
    }
    
    /**
     * 创建空分页结果
     *
     * @param current 当前页码
     * @param size    每页大小
     * @param <T>     泛型类型
     * @return 空的PageResult分页结果
     */
    public static <T> PageResult<T> empty(Long current, Long size) {
        return PageResult.empty(current, size);
    }
    
    /**
     * 转换分页数据类型
     *
     * @param pageResult 原分页结果
     * @param converter  数据转换器
     * @param <S>        源数据类型
     * @param <T>        目标数据类型
     * @return 转换后的PageResult分页结果
     */
    public static <S, T> PageResult<T> convert(PageResult<S> pageResult, Function<S, T> converter) {
        if (pageResult == null) {
            return PageResult.empty(1L, 10L);
        }
        
        List<T> convertedRecords = pageResult.getRecords().stream()
            .map(converter)
            .collect(Collectors.toList());
        
        return PageResult.of(
            convertedRecords,
            pageResult.getTotal(),
            pageResult.getCurrent(),
            pageResult.getSize()
        );
    }
    
    /**
     * 通过反射方式转换MyBatis Plus的IPage到PageResult
     * 这样可以避免直接依赖MyBatis Plus
     *
     * @param page MyBatis Plus分页对象(使用Object类型避免直接依赖)
     * @param <T>  泛型类型
     * @return PageResult分页结果
     */
    @SuppressWarnings("unchecked")
    public static <T> PageResult<T> convertFromIPage(Object page) {
        if (page == null) {
            return PageResult.empty(1L, 10L);
        }
        
        try {
            // 使用反射获取IPage的属性
            Class<?> pageClass = page.getClass();
            
            // 获取records
            List<T> records = (List<T>) pageClass.getMethod("getRecords").invoke(page);
            
            // 获取total - 可能返回long或Long类型
            Object totalObj = pageClass.getMethod("getTotal").invoke(page);
            Long total = totalObj instanceof Long ? (Long) totalObj : Long.valueOf(totalObj.toString());
            
            // 获取current - 可能返回long或Long类型  
            Object currentObj = pageClass.getMethod("getCurrent").invoke(page);
            Long current = currentObj instanceof Long ? (Long) currentObj : Long.valueOf(currentObj.toString());
            
            // 获取size - 可能返回long或Long类型
            Object sizeObj = pageClass.getMethod("getSize").invoke(page);
            Long size = sizeObj instanceof Long ? (Long) sizeObj : Long.valueOf(sizeObj.toString());
            
            return PageResult.of(records, total, current, size);
            
        } catch (Exception e) {
            // 反射失败时打印详细错误信息并返回空结果
            log.error(ExcpUtil.buildErrorMessage( e));
            return PageResult.empty(1L, 10L);
        }
    }
} 